This invention relates to the field of computers. More particularly, apparatus and methods are provided for managing interrupts within a virtualized input/output device that allows multiple hosts and functions to share a single port of the device.
Virtualized I/O devices provide considerable value because they allow a high-performance peripheral component to be shared among multiple applications, making it seem as if each application is receiving a separate, dedicated I/O device. From an application's perspective, each virtual device is completely isolated, and the device driver associated with each virtual device is unaware of the existence of any other. By isolating each virtual device's data from all other virtual devices, data privacy and integrity can be assured.
Peripheral Component Interconnect Express (PCIe) is a very widely used, standardized, computer system I/O technology. PCIe includes a virtualization model in which a Function operating on a host provides hardware traffic isolation and protection, as well as a standardized interface. Via this standard interface, system software can configure and manage anything from a monolithic input/output device supporting a single Function to a high-throughput input/output device supporting hundreds of virtual Functions.
Sharing of one physical input/output port among multiple Functions through virtualization, especially among multiple Functions hosted by different hosts, has not been successfully implemented previously because it presents several challenges. Among those challenges are isolating the hosts and Functions (even in the presence of errors), handling packets destined for multiple Functions (e.g., broadcast packets), supporting different data throughput rates for different hosts, and so on. Of considerable importance is the need to prevent support to multiple Functions and hosts to be blocked because of an issue or problem with one Function.
One particular difficulty lies in managing interrupts for the various Functions and hosts, while providing a fair allocation of resources and without blocking Traditional methods of parceling interrupt resources among multiple consumers usually involve static allocation, and require the device to be re-initialized in order to change the allocation. This can be very inefficient, especially if resources must be re-allocated on more than an occasional basis. To efficiently and effectively support multiple hosts and Functions, interrupt resources should be dynamically allocable and re-allocable.